#include "Node.h"
#include "NodeFactory.h"

/*
===============================================================================
 Name        : Node.cpp
 Author      : Bram en Paul
 Version     : 0.4
 Description : OOPatronen
===============================================================================
*/


/**
 * Constructor
 */
Node::Node(string ID)
{
	outputValue = -1;
	NodeFactory::assignNode(ID, this);
}

/**
 * Constructor
 */
Node::Node()
{
	outputValue = -1;
	completed = 0;
}


/**
 * Dit roept een Node aan bij een andere Node. Er wordt dan een waarde gezet in de inputlijst van de 'this' node.
 */
void Node::addInput(char Input)
{
	//Een digitaal signaal mag alleen 0 of 1 zijn.
	if(Input == 0 || Input == 1) 
	{
		//Voeg de nieuwe input toe aan een vector.
		inputs.push_back(Input);
		//Misschien output sturen?
		checkInputQuantity();
	}
}


/**
 * Dit roept de circuitmaker aan bij een Node. Er wordt dan een input van een Node aan de output van de 'this' node verbonden.
 */
void Node::addOutput(Node* Output)
{
	outputs.push_back(Output);
}


/**
 * Dit wordt aangeroepen als alle benodigde inputs bekend zijn. 
 * Op basis van die inputs wordt dan een berekening (operation) gedaan. 
 * De uitkomst wordt naar outputValue geschreven.
 */
void Node::operation()
{
	cout << "Warning: Generic node cannot execute an operation! \n";
}


/**
 * De outputValue wordt hier naar alle objecten in de outputlijst gestuurd.
 */
void Node::sendOperationResult()
{
	//Afvangen eventueel onvolbrachte operation.
	if(outputValue == -1) {
		cout << "Warning: Node failed to calculate output value. Output can't be sent to next Node(s). \n";
		return;
	}
	
	//Afvangen mogelijkheid dat de node niet vasthangt aan zijn output
	if(outputs.size() == 0) {
		cout << "Warning: This Node hasn't got any other Nodes connected to its output... \n";
		return;
	}
	
	//Send
	for(int i = 0; i < outputs.size(); i++) {
		outputs[i] -> addInput(outputValue);
	}
	
	//Deze node heeft zijn taak volbracht!
	completed = 1;
}


/**
 * Is it an input node?
 */
char Node::isInput()
{
	return 0;
}


/**
 * Heeft deze node zijn taak perfect uitgevoerd?
 */
char Node::isFinished()
{
	return completed;
}


/**
 * Destructor
 * 
 */
Node::~Node()
{
	//
}
